Next.jsアプリのイメージスキャンを新しいAWS Native に移行してみた
Next.jsアプリのコンテナイメージをECRのプライベートレジストリに登録して利用する環境で、CI中で実施していたイメージスキャンに失敗する事象が発生していました。
今回、この調査と対策を実施する機会がありましたので、紹介します。
発生原因
問題の発生した環境は、Docker Hub で公開されている Node のオフィシャルイメージを 最新 alpine を利用するタグ指定で利用していました。
- Dockerfile抜粋
FROM node:20-alpine AS base
イメージスキャンに失敗していたイメージのステータス (imageScanStatus )を確認したところ、サポート外の OS のため失敗していたことが分かりました。
- imageScanStatus
"imageScanStatus": {
"status": "FAILED",
"description": "UnsupportedImageError: The operating system 'alpine' version 'v3.21' is not supported."
},
2024年12月にリリースされた Alpine Linux 3.21 、従来の Clair ベースのベーシックスキャンではサポート対象外となっていました。
| Operating System | Version | AWS native basic | Clair basic |
| Alpine Linux (Alpine) | 3.21 | Yes | No |
| Alpine Linux (Alpine) | 3.20 | Yes | Yes |
暫定対策
ベーシックスキャン「Clair」がサポートする「Alpine 3.20」を指定する事で、暫定対策としました。
- 暫定対策後(Dockerfile)
FROM node:20-alpine3.20 AS base
恒久対策
AWS_NATIVE 有効化
新しいベーシックスキャン「AWS Native」への切り替えをオプトインしました。
プライベートレジストリ
オプトイン
CI スクリプトの変更
新しいベーシックスキャン「AWS_NATIVE」のオプトイン後、describe-images
の実行結果から、imageScanStatus の取得が出来なくなりました。
- AWS Native オプトイン前 (旧 Clair)
$ aws ecr describe-images --repository-name ${REPOSITORY_NAME} --image-ids imageDigest=${DIGEST} --query 'imageDetails[0].imageScanStatus'
{
"status": "COMPLETE",
"description": "The scan was completed successfully."
}
- AWS Native オプトイン後
$ aws ecr describe-images --repository-name ${REPOSITORY_NAME} --image-ids imageDigest=${DIGEST} --query 'imageDetails[0].imageScanStatus'
null
イメージスキャン結果のステータスを describe-image-scan-findings コマンドから取得するよう、スクリプトの修正を実施しました。
$ DIGEST='sha256:****'
$ REPOSITORY_NAME='****-****'
$ REGISTRY_ID='000000000000'
$ IMAGE_TAG=$(aws ecr list-images --repository-name ${REPOSITORY_NAME} --registry-id ${REGISTRY_ID} | jq -r ".imageIds[] | select(.imageDigest == \"${DIGEST}\") | .imageTag")
$ aws ecr describe-image-scan-findings --repository-name ${REPOSITORY_NAME} --image-id imageTag=${IMAGE_TAG} --registry-id ${REGISTRY_ID} --query 'imageScanStatus'
{
"status": "COMPLETE",
"description": "The scan was completed successfully."
}
まとめ
2024年8月、 Amazon ECR の新しいベーシックスキャン「AWS Native」がリリースされました。
従来のベーシックスキャン「Clair」は、2025年10月1日でサポート終了となることが2024年11月に案内されました。
従来のベーシックスキャン「Clair」は2025年10月まで利用できる予定とされていますが、今回紹介した Alpine Linux 3.21 以外にも、最新 OS を中心にサポート外となるイメージが増えることが予想されます。
古いベーシックスキャンを利用するために、OS のバージョンを古いバージョンに留める利用は望ましくありません。実行するアプリケーションが 最新バージョンの OS に追従できる場合、新しいベーシックスキャンをオプトインし「AWS Native」への移行を余裕を持ったスケジュールで実施することをおすすめします。